const PostType = require('./models.js')
const shortid = require('shortid')
const Util = require('../utils/util.js')

// 校验创建分类的参数
let checkCateFields = (formData, req) => {
  // 超级管理员用户才可以创建分类
  // let hasLogin = req.session.userLogined
  // let userInfo = req.session.userInfo

  // if (!hasLogin || userInfo.role !== 'super') {
  //   return false
  // }

  let { name, description, sort_id, parent_id } = formData

  if (name.length <= 0 || name.length > 10) {
    return false
  } else if (description.length > 40) {
    return false
  // } else if (!/^[a-zA-Z0-9_-]{1,32}$/.test(default_url)) {
  //   return false
  } else if (Number(sort_id) <= 0) {
    return false
  // } else if (type !== 1 && type !== 2 && type !== 3) {
  //   return false
  } else if (!shortid.isValid(parent_id) && parent_id !== '0') {
    return false
  }

  return true
}

module.exports = {
  /**
   * 创建分类
   * @param {*} req 
   * @param {*} res 
   * @param {*} next 
   */
  async createOne(req, res, next) {
    // 校验传入的参数
    let fields = req.body
    try {
      let validateResult = checkCateFields(fields, req)
      if (!validateResult) {
        return res.status(500).send(Util.renderApiErr(req, res, 500, '数据校验失败'))
      }
    } catch (err) {
      return res.status(500).send(Util.renderApiErr(req, res, 500, err))
    }

    const obj = {
      sort_id: fields.sort_id,
      parent_id: fields.parent_id,
      group:Util.checkGroupId(fields.group),
      name: fields.name,
      description: fields.description,
      default_url: fields.default_url,
      enable: fields.enable ? true : false
    }

    const newPostType = new PostType(obj)

    try {
      let cateObj = await newPostType.save()
      // 更新sortPath defaultUrl
      let newQuery = {}
      if (fields.parent_id === '0') {
        newQuery.sort_path = '0,' + cateObj._id
      } else {
        let parentObj = await PostType.findOne({ '_id': fields.parent_id }, 'sort_path default_url')
        Util.log('parentObj ', parentObj)
        newQuery.sort_path = parentObj.sort_path + "," + cateObj._id
        newQuery.default_url = parentObj.default_url + '-' + fields.default_url
      }
      await PostType.findOneAndUpdate({ _id: cateObj._id }, { $set: newQuery })
      return res.send(Util.renderApiData(req, res, 200, '分类创建成功', { id: cateObj._id }))
    } catch (err) {
      return res.status(500).send(Util.renderApiErr(req, res, 500, err))
    }
  },

  /**
   * 获取分类列表
   * @param {*} req 
   * @param {*} res 
   * @param {*} next 
   */
  async getList(req, res, next) {
    try {
      let fields = req.query
      let queryObj = {}
      let group = fields.group
      // let parent_id = fields.parent_id  // 父级分类ID
      // let enable = fields.enable  // 是否启用

      // if (parent_id) {
      //   queryObj['parent_id'] = parent_id
      // }

      // if (enable === 'true') {
      //   queryObj['enable'] = true
      // }

      if (group){
        queryObj['group'] = group
      }

      // 查询文档
      // const typeList = await PostType.find(queryObj).sort({ sort_id: -1 }).skip((page - 1) * pageSize).limit(pageSize).exec()
      const typeList = await PostType.find(queryObj).sort({ sort_id: -1 }).exec()
      // const totalCounts = await PostType.count(queryObj)

      let cateObj = {
        list: typeList
      }
      return res.send(Util.renderApiData(req, res, 200, '分类列表获取成功', cateObj))
    } catch (err) {
      return res.status(500).send(Util.renderApiErr(req, res, 500, err))
    }
  },

  /**
   * 删除分类 可同时删除多个
   * @param {*} req 
   * @param {*} res 
   * @param {*} next 
   */
  async deleteOne(req, res, next) {
    try {
      let errMsg = ''
      let id = req.body._id
      let queryObj = { 
        _id: req.body._id,
        group: Util.checkGroupId(req.body.group)
      }
      Util.log(id)
      if (!shortid.isValid(id)) {
        errMsg = 'ID格式校验失败'
      }
      if (errMsg) {
        return res.status(500).send(Util.renderApiErr(req, res, 500, errMsg))
      }

      // 判断该分类是否含有下级分类，如果存在，强制删除下级分类才可删除该分类
      let subCateCount = await PostType.count({parent_id: id})
      if (subCateCount > 0) {
        errMsg = '请先删除下级分类再删除该分类'
      }
      if (errMsg) {
        return res.status(500).send(Util.renderApiErr(req, res, 500, errMsg))
      }

      await PostType.remove(queryObj)
      return res.send(Util.renderApiData(req, res, 200, '删除成功', {}))
    } catch (err) {
      return res.status(500).send(Util.renderApiErr(req, res, 500, err))
    }
  },

    /**
   * 更新
   * @param {*} req 
   * @param {*} res 
   * @param {*} next 
   */
  async updateOne(req, res, next) {
    // 校验传入的参数
    let fields = req.body
    try {
      let validateResult = checkCateFields(fields, req)
      if (!validateResult) {
        return res.status(500).send(Util.renderApiErr(req, res, 500, '数据校验失败'))
      }
      // 如果id不合法，则返回校验失败
      if (!shortid.isValid(fields._id)) {
        return res.status(500).send(Util.renderApiErr(req, res, 500, '数据校验失败'))
      }
    } catch (err) {
      return res.status(500).send(Util.renderApiErr(req, res, 500, err))
    }

    const obj = {
      sort_id: fields.sort_id,
      group:fields.group,
      parent_id:fields.parent_id,
      name: fields.name,
      description: fields.description,
      default_url: fields.default_url,
      enable: fields.enable ? true : false
    }

    Util.log(obj)

    try {
      let item_id = fields._id
      await PostType.findOneAndUpdate({ _id: item_id }, { $set: obj })
      return res.send(Util.renderApiData(req, res, 200, '分类更新成功', { id: item_id }))
    } catch (err) {
      return res.status(500).send(Util.renderApiErr(req, res, 500, err))
    }
  },

  /**
   * 获取一个分类
   * @param {*} req 
   * @param {*} res 
   * @param {*} next 
   */
  async getOne(req, res, next) {
    try {
      let queryObj = { 
        _id: req.query._id,
        group: req.query.group
      }
      const cate = await PostType.findOne(queryObj).exec()

      return res.send(Util.renderApiData(req, res, 200, '获取成功', cate || {}))
    } catch (err) {
      return res.status(500).send(Util.renderApiErr(req, res, 500, err))
    }
  }
}
